#!/usr/bin/python
# -*-coding:UTF-8 -*-

# ========================
# @Time  : 2021-01-24
# @Author: Sunny
# ========================


#生成器的常用方法
"""
生成器：它是一种特殊的迭代器(生成器内部保存的是生成数据的规则规律)
       生成器比迭代器更高级，生成器可以用next()

创建生成器的2种方式：
1.生成器表达式
2.生成器函数:只要函数中使用了yield关键字，那么这个函数就是一个生成器函数

生成器的常用函数
1.next()
2.生成器send方法可以和生成器内部进行数据交互
3.close() 关闭生辰器
4.throw() 往生成器内部发送一个异常
"""


def gen():
    for i in range(10):
        s = yield i * 5   #s为send传进来的数据，send传进来的数据需要接收后，才可以使用，若没有接收，可以传，但不能使用
                          #此种接收方式为固定语法
        print('send传递进来的数据为:',s)

g = gen()


#生成器常用函数
#1.next()方法，依次生成数据返回
print('第1次生成数据：',next(g))


#2.生成器的send()方法，比较常用，send方法可以和生成器内部进行数据交互，也就是说，用send方法可以传数据到生成器内部去
# 调用send方法之前要执行一次next()来启动生成器，否则会报错
# (原理：send生成器传递给数据，是用yield那行的s进行接收的，如果不先启动生成器，则代码从第一行开始执行，那里无法接收send传的值
# 用next()方法后，会生成一组数据，代码执行顺序会停在yield那行，再执行send，才能接收到send的值)
print('第1次使用send方法生成的数据',g.send(100))
print('第2次使用send方法生成的数据',g.send(200))
print('第3次使用send方法生成的数据',g.send(300))




#使用demo,可以通过传递进去的数据，按规则生成执行数据
# def gen():
#     s = 0
#     for i in range(10):
#         s = yield s ** 2
#         # y,s = yield s ** 2
#         print('send传递进来的数据为:',s)
# g = gen()
# print('第1次生成数据：',next(g))
# # print('第1次使用send方法生成的数据',g.send((100,200)))    #要传多个数据，需要以元组的形式传
# print('第2次使用send方法生成的数据',g.send(5))
# print('第3次使用send方法生成的数据',g.send(7))



#close()  关闭生成器
# def gen():
#     s = 0
#     for i in range(10):
#         s = yield s ** 2
#
#         print('send传递进来的数据为:',s)
# g = gen()
# print('第1次生成数据：',next(g))
# g.close()
# print('第2次生成数据：',next(g))  #关闭生成器后再次生成数据，会抛出异常


#throw:往生成器内部发送一个异常
# def gen2():
#     try:
#         yield 11
#         yield 22
#     except Exception as e:
#         print(e)
#
# g2 = gen2()
# #三个参数分别为：异常类型，异常信息，异常溯源信息
# print(next(g2))
# g2.throw(ValueError,'主动抛出异常')